\documentclass[paper=a4, fontsize=11pt]{scrartcl} % A4 paper and 11pt font size

\usepackage[T1]{fontenc} % Use 8-bit encoding that has 256 glyphs
\usepackage{fourier} % Use the Adobe Utopia font for the document - comment this line to return to the LaTeX default
\usepackage[english]{babel} % English language/hyphenation
\usepackage{amsmath,amsfonts,amsthm} % Math packages
\usepackage[UTF8]{ctex}
\usepackage{graphicx}
\usepackage{float}
\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry}
\usepackage[linesnumbered,boxed,lined,ruled]{algorithm2e}
\usepackage{algorithmicx}
\usepackage{algpseudocode}

\usepackage{xcolor}
\usepackage[framed,numbered,autolinebreaks,useliterate]{mcode}
\usepackage{listings}
\usepackage{multirow}
\usepackage{sectsty} % Allows customizing section commands
\allsectionsfont{\centering \normalfont\scshape} % Make all sections centered, the default font and small caps
\usepackage{multirow}
\usepackage{fancyhdr} % Custom headers and footers
\pagestyle{fancyplain} % Makes all pages in the document conform to the custom headers and footers
\fancyhead{} % No page header - if you want one, create it in the same way as the footers below
\fancyfoot[L]{} % Empty left footer
\fancyfoot[C]{} % Empty center footer
\fancyfoot[R]{\thepage} % Page numbering for right footer
\renewcommand{\headrulewidth}{0pt} % Remove header underlines
\renewcommand{\footrulewidth}{0pt} % Remove footer underlines
\setlength{\headheight}{13.6pt} % Customize the height of the header

\numberwithin{equation}{section} % Number equations within sections (i.e. 1.1, 1.2, 2.1, 2.2 instead of 1, 2, 3, 4)
\numberwithin{figure}{section} % Number figures within sections (i.e. 1.1, 1.2, 2.1, 2.2 instead of 1, 2, 3, 4)
\numberwithin{table}{section} % Number tables within sections (i.e. 1.1, 1.2, 2.1, 2.2 instead of 1, 2, 3, 4)

\setlength\parindent{0pt} % Removes all indentation from paragraphs - comment this line for an assignment with lots of text

%----------------------------------------------------------------------------------------
%	TITLE SECTION
%----------------------------------------------------------------------------------------

\newcommand{\horrule}[1]{\rule{\linewidth}{#1}} % Create horizontal rule command with 1 argument of height

\title{
\normalfont \normalsize
\textsc{中国科学院大学\ 计算机与控制学院} \\ [25pt] % Your university, school and/or department name(s)
\horrule{0.5pt} \\[0.4cm] % Thin top horizontal rule
\huge 模式识别第四次作业 \\ % The assignment title
\horrule{2pt} \\[0.5cm] % Thick bottom horizontal rule
}

\author{黎吉国&201618013229046} % Your name

\date{\normalsize\today} % Today's date or a custom date

\begin{document}

\maketitle % Print the title
\newpage
\section{answer for 1st}
计算三层BP网络的权重更新规则，其中输出层使用了softmax操作，准则函数为
\[ J(w)=\frac{1}{2}\Sigma_{k=1}^{c}(t_k-z_k)^2 \]
\textbf{解：}\\
BP网络使用梯度下降法进行权值的更新。
\begin{enumerate}
  \item 隐含层到输出层的权值更新
  \[ \omega_{kj}=\omega_{kj}+\eta \Delta \omega_{kj} \]
  \[ \Delta \omega_{kj}=\frac{\partial J}{\partial \omega_{kj}} \]
  \[
  \begin{split}
    \frac{\partial J}{\partial \omega_{kj}} &= \frac{\partial J}{\partial z_k} \frac{\partial z_k}{\partial net_k} \frac{\partial net_k}{\partial \omega_{kj}}\\
    &=-(t_k-z_k)\frac{1}{\Sigma_{m=1}^{c}e^{net_k}}y_j
  \end{split}
  \]
  \item 输入层到隐含层的权值更新
  \[ \omega_{ji}=\omega_{ji}+\eta \Delta \omega_{ji} \]
  \[ \Delta \omega_{ji}=\frac{\partial J}{\partial \omega_{ji}} \]
  \[
  \begin{split}
    \frac{\partial J}{\partial \omega_{ji}} &= \Sigma_{k=1}^{c}\frac{\partial J}{\partial z_k} \frac{\partial z_k}{\partial net_k} \frac{\partial net_k}{\partial y_j}\frac{y_j}{\omega_{ji}}\\
    &=-\Sigma_{k=1}^{c}(t_k-z_k)\frac{1}{\Sigma_{m=1}^{c}e^{net_k}}\omega_{kj}x_i
  \end{split}
  \]
\end{enumerate}

\section{answer for 2ed}
\begin{enumerate}
  \item 对BP算法的训练步骤总结
    \begin{enumerate}
    \item 按照一定策略初始化初始权值
    \item 读入训练数据，并根据训练数据，使用梯度下降法对权值进行更新，直至误差满足要求。
    \end{enumerate}
  \item 不同的权重更新公式。准则的函数的设计直接影响最终的更新公式，常用的准则函数如下：
  \begin{enumerate}
    \item 平方误差准则函数
    \[ E(w)=\Sigma_{k,j}(t_j^k-z_j^k)^2\]
    \item 交叉熵准则：
    \[ E_{ce}(w)=\Sigma_{k,j}t_j^k\ln{(t_j^k/z_j^k)} \]
    \item Minkowski误差准则
    \[ E_{Mink}(w)=\Sigma_{k,j}| t_j^k -z_j^k |^R , 1\le R \ge 2 \]
  \end{enumerate}
  其中$t$和$z$分别表示教师信号和输出信号。
\item 影响网络性能的因素
\begin{enumerate}
  \item 隐含层的节点个数.\\
  隐含层的节点个数决定了网络的表达能力，隐含节点个数太少，网络表达能力不够，就不能对训练数据正确分类。隐含层网络节点过多，则会得到复杂的分界面，使得网络的泛化能力减弱，在测试集上得不到好的结果。
  \item 激活函数。\\
  激活函数决定了网络的非线性映射能力。
  \item 训练数据的多少。\\
  在训练数据较少时，有可能使得网络没能收敛到一个合适的值，训练数据过多时，又会造成网络的过拟合，只有在网络的大小和训练数据之间有比较好的关系时，才能得到比较好的分类效果。
  \item 初始值。\\
  初始值的选择会大大影响网络训练的速度，合适的初值可以加快网络的训练速度，避免其陷入局部极小值和局部的平坦区。
\end{enumerate}
\end{enumerate}

\section{answer for 3th}
\begin{enumerate}
  \item 自组织网络的构造原理\\
  在竞争层中，神经元之间有竞争关系，通过竞争，得到一个获胜神经元，在更新该获胜神经元的权值时，也将影响到其邻域的神经元。
  \item 学习步骤
  \begin{enumerate}
    \item 网络初始化
    \item 输入向量
    \item 计算映射层的权重向量和输入向量的距离
    \item 确定获胜者：与输入向量距离最近的权重向量是获胜者
    \item 调整获胜神经元的权重，并按照一定的权重来影响其邻域的神经元的连接权重。
    \item 如果达到停止要求，则退出，否则，返回(b)
  \end{enumerate}
\end{enumerate}
\section{answer for 4th}
\begin{enumerate}
  \item 权重数量。这里采用局部连接和权值共享策略
  \[
  \begin{split}
    25\times 1 \times 20 + 9 \times 20 \times 30 + 9 \times 30 \times 20 + 9 \times 20 \times 10= 14000
  \end{split}
   \]
   \item 遇到maxpooling时误差如何传播\\
   pooling操作相当于对特征进行上采样，那么反向传播时，应该将低维特征的误差分摊到相应的高维特征上。
   \item 网络结构的改变\\
   该网络是一个前馈网络，可以通过加入反馈环节来得到得到时延信息。
\end{enumerate}

\section{编程题}
使用批量更新的matlab实现如下（其中输入层到隐含层的激活函数使用sigmoid,隐含层和输出层的激活函数也使用sigmoid）：

\lstset{language=Matlab}%代码语言使用的是matlab
\lstset{breaklines}%自动将长的代码行换行排版
\lstset{extendedchars=false}%解决代码跨页时，章节标题，页眉等汉字不显示的问题
\begin{lstlisting}[frame=single]
function [omega_ji, omega_kj, J_record]=BP_network(data,label);
%data:4*30, label:3*30
%隐含层5，输入，3，输出3
dim_in=4;
dim_hide=10;
dim_out=3;
size_data=size(data);
size_label=size(label);
y=zeros(dim_hide,1);
z=zeros(dim_out,1);
%初始化omega
omega_ji=unifrnd(-1/sqrt(dim_in),1/sqrt(dim_in),[dim_in dim_hide]);
eta_ji=0.9;
omega_kj=unifrnd(-1/sqrt(dim_hide),1/sqrt(dim_hide),[dim_hide dim_out]);
eta_kj=0.9;
delta_omega_kj=0;
delta_omega_ji=0;
J_record=1;
step=0;
delta_omega_ji_temp=0;
delta_omega_kj_temp=0;
a=1.716;
b=2/3.0;
while 1
    step =step+1;
    eta_kj=1/sqrt(step);
    eta_ji=eta_kj;
    x_total=data;
    y_total=zeros(dim_hide,size_data(2));
    z_total=zeros(dim_out,size_data(2));

    %get J
    for m=1:size_data(2)
     %y_total(:,m)=transpose(mytanh(transpose(x_total(:,m))*omega_ji));
     y_total(:,m)=transpose(sigmoid(transpose(x_total(:,m))*omega_ji));
     z_total(:,m)=transpose(sigmoid(transpose(y_total(:,m))*omega_kj));
     %归一化输出
     %z_sum=sum(z_total(:,m));
     %z_total(:,m)=(z_total(:,m))./z_sum;
    end
    diff=label-z_total;
    J= 0.5*trace( diff*diff');
    if J<1 || step>1000
        break;
    end
    J_record=[J_record; J];

 for m=1:size_data(2)
     x=x_total(:,m);
     y=y_total(:,m);
     z=z_total(:,m);
     t=label(:,m);
     delta_omega_kj=delta_omega_kj + transpose(-(label(:,m)-z).*z.*(1.-z) * y');
     temp=( omega_kj*(-(t-z).*z.*(1.-z)) );
     temp=temp.*y.*(1.-y);
     %temp1=b.*((y-a).*(1- (y-a)./2./a));
     %temp=temp.*temp1;
     delta_omega_ji= delta_omega_ji+ transpose(temp*x');
 end
alpha=0.5;
 omega_kj=omega_kj-eta_kj*(alpha.*delta_omega_kj+(1-alpha).*delta_omega_kj_temp);
 omega_ji=omega_ji-eta_ji*(alpha.*delta_omega_ji+(1-alpha).*delta_omega_ji_temp);

 delta_omega_kj_temp=delta_omega_kj;
 delta_omega_ji_temp=delta_omega_ji;
end

end

function y=sigmoid(x);
size_x=size(x);
y=zeros(size_x);

for m=1:size_x(1)
    for n=1:size_x(2)
        y(m,n)=1/(1+exp(-x(m,n)));
    end
end
end


function  y=mytanh(x);
size_x=size(x);
y=zeros(size_x);
a=1.716;
b=2/3.0;
for m=1:size_x(1)
    for n=1:size_x(2)
        y(m,n)=2*a/(1+exp(-b*x(m,n)))-a;
    end
end
end
\end{lstlisting}
\begin{enumerate}
  \item 隐含层的不同节点数目对训练的影响：隐含层的节点越多，表达能力越强，但是更容易过拟合。
  \item 不同的梯度更新步长的影响：约接近极值，步长应该越小，步长过大可能发散，步长过小则训练太慢。
  \item 目标函数的变化曲线如下：
  \begin{figure}[H]
  \centering
  \includegraphics[width=6in,height=3in]{J.jpg}
  \caption{$J=0.5\Sigma_{k=1}^c (t_k-z_k)^2$}
  \label{fig:graph}
  \end{figure}
\end{enumerate}
\end{document}
